﻿using System;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Collections.Generic;
using Bovespa.Infra.Data;
using Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades;

namespace Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Dados
{
    /// <summary>
    /// Fornece operacoes de acesso a dados para a entidade de negocio "Versao".
    /// </summary>
    public class Versao
    {
        #region Campos

        private int aplicacaoID = -1; //Id do Sistema

        #endregion

        #region Properties

        private int AplicacaoID
        {
            get
            {
                if (-1 == aplicacaoID)
                {
                    System.Configuration.AppSettingsReader reader = new System.Configuration.AppSettingsReader();
                    aplicacaoID = (int)reader.GetValue("ApplicationInfraID", typeof(int));
                }
                return aplicacaoID;
            }
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Recupera uma lista de entidades de negocio "Versao" do banco de dados.
        /// </summary>
        public List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao> ConsultarVersao()
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao> listaVersao = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao>();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_VERSAO");

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao versao = new Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao();

                    int codigoIndice = dados.GetOrdinal("CD_VERSAO");
                    versao.Codigo = dados.GetInt32(codigoIndice);

                    int codigoProdutoIndice = dados.GetOrdinal("CD_PRODUTO");
                    versao.CodigoProduto = dados.GetInt32(codigoProdutoIndice);

                    int numeroVersaoIndice = dados.GetOrdinal("NM_VERSAO");
                    versao.NumeroVersao = !dados.IsDBNull(numeroVersaoIndice) ? dados.GetString(numeroVersaoIndice) : null;

                    int observacaoIndice = dados.GetOrdinal("DS_OBSERVACAO_VERSAO");
                    versao.Observacao = !dados.IsDBNull(observacaoIndice) ? dados.GetString(observacaoIndice) : null;

                    listaVersao.Add(versao);
                }
            }
            return listaVersao;
        }

        /// <summary>
        /// Recupera uma lista de entidades de negocio "Versao" do banco de dados por código de produto.
        /// </summary>
        public List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao> ConsultarVersaoPorProduto(int codigoProduto)
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao> listaVersao = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao>();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_VERSAO_POR_PRODUTO");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, codigoProduto);

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao versao = new Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao();

                    int codigoIndice = dados.GetOrdinal("CD_VERSAO");
                    versao.Codigo = dados.GetInt32(codigoIndice);

                    int codigoProdutoIndice = dados.GetOrdinal("CD_PRODUTO");
                    versao.CodigoProduto = dados.GetInt32(codigoProdutoIndice);

                    int numeroVersaoIndice = dados.GetOrdinal("NM_VERSAO");
                    versao.NumeroVersao = !dados.IsDBNull(numeroVersaoIndice) ? dados.GetString(numeroVersaoIndice) : null;

                    int observacaoIndice = dados.GetOrdinal("DS_OBSERVACAO_VERSAO");
                    versao.Observacao = !dados.IsDBNull(observacaoIndice) ? dados.GetString(observacaoIndice) : null;

                    listaVersao.Add(versao);
                }
            }
            return listaVersao;
        }

        /// <summary>
        /// Recupera uma entidade de negocio "Versao" do banco de dados.
        /// </summary>
        public Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao ObterVersao(int codigoProduto, int codigoVersao)
        {
            Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao versao = new Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_VERSAO_POR_PK");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, codigoProduto);
            conexao.AddInParameter("P_CD_VERSAO", DbType.Int32, codigoVersao);

            using (IDataReader dados = conexao.ExecuteReader())
            {
                if (dados.Read())
                {
                    int codigoIndice = dados.GetOrdinal("CD_VERSAO");
                    versao.Codigo = dados.GetInt32(codigoIndice);

                    int codigoProdutoIndice = dados.GetOrdinal("CD_PRODUTO");
                    versao.CodigoProduto = dados.GetInt32(codigoProdutoIndice);

                    int numeroVersaoIndice = dados.GetOrdinal("NM_VERSAO");
                    versao.NumeroVersao = dados.GetString(numeroVersaoIndice);

                    int observacaoIndice = dados.GetOrdinal("DS_OBSERVACAO_VERSAO");
                    versao.Observacao = dados.GetString(observacaoIndice);

                }
            }
            return versao;
        }

        /// <summary>
        /// Persiste uma entidade de negocio "Versao" no banco de dados.
        /// </summary>
        public void InserirVersao(Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao versao)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_IN_TB_VERSAO");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, versao.CodigoProduto);
            
            if (versao.NumeroVersao != null )
                conexao.AddInParameter("P_NM_VERSAO", DbType.String, versao.NumeroVersao);

            if (versao.Observacao != null && versao.Observacao != "")
                conexao.AddInParameter("P_DS_OBSERVACAO_VERSAO", DbType.String, versao.Observacao);
            else
                conexao.AddInParameter("P_DS_OBSERVACAO_VERSAO", DbType.String, null);

            conexao.AddOutParameter("P_CD_VERSAO_RET", DbType.Int32, 4);

            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Remove uma entidade de negocio "Versao" do banco de dados.
        /// </summary>
        public void ExcluirVersao(int codigoProduto, int codigoVersao)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_DL_TB_VERSAO");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, codigoProduto);
            conexao.AddInParameter("P_CD_VERSAO", DbType.Int32, codigoVersao);
            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Atualiza uma entidade de negocio "Versao" no banco de dados.
        /// </summary>
        public void AtualizarVersao(Bovespa.Sinacor.Servico.BaseConhecimento.Versao.Entidades.Versao versao)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_UP_TB_VERSAO");
            conexao.AddInParameter("P_CD_VERSAO", DbType.Int32, versao.Codigo);
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, versao.CodigoProduto);
            if (versao.NumeroVersao != null)
            {
                conexao.AddInParameter("P_NM_VERSAO", DbType.String, versao.NumeroVersao);
            }
            if (versao.Observacao != null)
            {
                conexao.AddInParameter("P_DS_OBSERVACAO_VERSAO", DbType.String, versao.Observacao);
            }
            conexao.ExecuteNonQuery();
        }

        #endregion
    }
}

